#******************************
# Poojet Galax 
# Moteur experimental minimaliste 3D
# Gonzalo I.
#******************************

import random
import sys
from Tkinter import *


#******************************
#    Transferer dans 
#        SERVEUR
#******************************

#####  Modele #####  
class Partie(object):
    def __init__(self, parentControleur):
        self.matriceGalax=Univers(200,200,100,self)
        self.matriceGalax.placerEtoiles()
        self.monPointDeVue=PointDeVue(50,50,0,self)
           
class Univers(object):
    #Que la lumiere soit
    #Creation matrice x*y initialise a 0
    def __init__(self,x,y,z, parentPartie):
        self.parentPartie=parentPartie
        self.grandeurX=x
        self.grandeurY=y
        self.grandeurZ=z
        self.maMatrice = []
        for i in range(x):
            ligneMatrice = []
            for j in range(y):
                profondeurMatrice = []
                for k in range(z):
                    profondeurMatrice.append(0)
                ligneMatrice.append(profondeurMatrice)               
            self.maMatrice.append(ligneMatrice)

    #reinitialiser toute la matrice a 0
    def reset(self):
        for x in range(self.grandeurX):
            for y in range(self.grandeurY):
                for z in range(self.grandeurZ):
                    self.maMatrice[x][y][z] = 0
                
    #Qu'il y ait des luminaires dans l'etendue du ciel!
    #chaque case a 1 chance sur 250 davoir une etoile
    def placerEtoiles(self):
        for x in range(self.grandeurX):
            for y in range(self.grandeurY):
                for z in range(self.grandeurZ):
                    if (random.randrange( 0, 2000 )!=42):  
                        self.maMatrice[x][y][z] = 0
                    else:
                        self.maMatrice[x][y][z] = 1
                    
    def getCase(self,x,y,z):
        return self.maMatrice[x][y][z]


    def setCase(self,x,y,z,valeur):
        self.maMatrice[x][y][z]=valeur
     
    #retourne une matrice 50x50 du secteur a afficher  (xy = coin superieur gauche)
    def getSecteur(self,x,y,z):
        secteur = []
        for i in range(x,x+50):
            ligneSecteur = []
            for j in range(y,y+50):
                profondeurSecteur = []
                for k in range(z,z+50):
                    profondeurSecteur.append(self.getCase(i,j,k))
                ligneSecteur.append(profondeurSecteur)               
            secteur.append(ligneSecteur) 
        return secteur     

               
class PointDeVue(object):
    def __init__(self, x, y, z, parentPartie):
        self.positionX=x
        self.positionY=y
        self.positionZ=z
        self.parentPartie=parentPartie

    def getPointDeVue(self):
        secteur=self.parentPartie.matriceGalax.getSecteur(self.positionX,self.positionY,self.positionZ)
        return secteur
        
    def deplacerPointDeVue(self, deplacementX,deplacementY,deplacementZ):
        self.positionX=self.positionX+deplacementX
        self.positionY=self.positionY+deplacementY 
        self.positionZ=self.positionZ+deplacementZ      
        return self.getPointDeVue()
    

#####  FIN Modele #####     
#******************************
#        FIN SERVEUR
#******************************


#####  Controleur #####   
class Controleur(object):
    def __init__(self):
        self.modele=Partie(self) 
        self.vue=VueTkinter(self)
        self.demarrer()     

    def demarrer(self):
        self.vue.root.mainloop()
     
    #Traitement des commandes Button   
    #Update le secteur a afficher
    #rafrachir ecran 
    def commandButtonNW(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(-1,-1,0)
        self.vue.afficheSecteur(secteur)
        
    def commandButtonN(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(0,-1,0)
        self.vue.afficheSecteur(secteur)
        
    def commandButtonNE(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(1,-1,0)     
        self.vue.afficheSecteur(secteur)    
        
    def commandButtonW(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(-1,0,0)      
        self.vue.afficheSecteur(secteur)  
          
    def commandButtonC(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(0,0,1)
        self.vue.afficheSecteur(secteur) 
          
    def commandButtonE(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(1,0,0)
        self.vue.afficheSecteur(secteur)  
        
    def commandButtonSW(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(-1,1,0)   
        self.vue.afficheSecteur(secteur)  
         
    def commandButtonS(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(0,1,0)           
        self.vue.afficheSecteur(secteur)    
        
    def commandButtonSE(self):    
        secteur=self.modele.monPointDeVue.deplacerPointDeVue(1,1,0)     
        self.vue.afficheSecteur(secteur)        

#####  FIN Controleur #####   

#####  VueGraphique  #####              
class VueTkinter(object):
    def __init__(self,parentControleur):
        self.root=Tk()
        self.root.title("GALAX")        
        self.largeur=600
        self.hauteur=600
        self.statusBar = Label(self.root, text="Credits: 0 | Mineraux: 0 | Gaz: 0 Energie: 0", bd=1, relief=SUNKEN, anchor=W)
        self.statusBar.pack(side=TOP, fill=X)
        self.canevas=Canvas(self.root,width=self.largeur,height=self.hauteur,bg="black")
        self.canevas.pack(side=TOP)
        menu = Menu(self.root)
        self.root.config(menu=menu)
        PrincipalMenu = Menu(menu)
        menu.add_cascade(label="Partie", menu=PrincipalMenu)
        PrincipalMenu.add_command(label="Nouvelle Partie", command=self.root.quit)
        PrincipalMenu.add_command(label="Quitter", command=self.root.quit)
        scoreMenu = Menu(menu)
        self.frameMouvement = Frame(self.root)
        self.frameMouvement.pack(side=BOTTOM)
        self.NW = Button(self.frameMouvement,text="\\",command=parentControleur.commandButtonNW)
        self.N = Button(self.frameMouvement,text="^",command=parentControleur.commandButtonN)
        self.NE = Button(self.frameMouvement,text="/",command=parentControleur.commandButtonNE)
        self.W = Button(self.frameMouvement,text="<",command=parentControleur.commandButtonW)
        self.C = Button(self.frameMouvement,text="o",command=parentControleur.commandButtonC)
        self.E = Button(self.frameMouvement,text=">",command=parentControleur.commandButtonE)
        self.SW = Button(self.frameMouvement,text="/",command=parentControleur.commandButtonSW)
        self.S = Button(self.frameMouvement,text="v",command=parentControleur.commandButtonS)
        self.SE = Button(self.frameMouvement,text="\\",command=parentControleur.commandButtonSE)
        
        self.NW.grid(row=0, column=0)
        self.N.grid(row=0, column=1)
        self.NE.grid(row=0, column=2)
        self.W.grid(row=1, column=0)
        self.C.grid(row=1, column=1)
        self.E.grid(row=1, column=2)
        self.SW.grid(row=2, column=0)
        self.S.grid(row=2, column=1)
        self.SE.grid(row=2, column=2) 
    
        self.frameWeapons = Frame(self.root)
        self.frameWeapons.pack(side=BOTTOM)

        #self.monTimer()
        self.afficheSecteur(parentControleur.modele.monPointDeVue.getPointDeVue())

#    def tick(self):
#        self.bougerEtoile()
#        self.after(200, tick)

    def afficherEtoile(self,x,y,tailleEtoile):
        #tailleEtoile=12
        decalageX=1
        decalageY=2        
        self.canevas.create_oval(x*tailleEtoile+decalageX,y*tailleEtoile+decalageY,x*tailleEtoile+decalageX+tailleEtoile,y*tailleEtoile+decalageY+tailleEtoile, fill='white')                    
            
    def afficheSecteur(self,secteur):
        tailleSecteur=50
        self.effaceEcran()
        for z in range(tailleSecteur-1,0,-1):
            for x in range(tailleSecteur):
                for y in range(tailleSecteur):
                    if (secteur[x][y][z] == 1):
                        self.afficher3D(x,y,z)


    def afficher3D(self,x,y,z):  
        if (z>25): 
            self.afficherEtoile(x,y,600/50)      
        elif(z>16):
            if (5<x<45):
                if (5<y<45):
                    x=x-5
                    y=y-5
                    x=x*50/40
                    y=y*50/40
                    self.afficherEtoile(x,y,600/40)       
        elif(z>6):
            if (10<x<40):
                if (10<y<40):
                    x=x-10
                    y=y-10
                    x=x*50/30
                    y=y*50/30
                    self.afficherEtoile(x,y,600/30)  
        elif(z>3):
            if (15<x<35):
                if (15<y<35):
                    x=x-15
                    y=y-15
                    x=x*50/20
                    y=y*50/20
                    self.afficherEtoile(x,y,600/20)        
        else:
            if (20<x<30):
                if (20<y<30):
                    x=x-20
                    y=y-20
                    x=x*50/10
                    y=y*50/10
                    self.afficherEtoile(x,y,600/10)  

    def effaceEcran(self):
        self.canevas.delete(ALL)
#   
    def monTimer(self):
        self.bougerEtoile()
        print"fuck"   
        self.canevas.after(600, self.monTimer)         
                                 
#####  FIN VueGraphique  #####      

            
if __name__ == '__main__':
        controleur=Controleur()

